﻿using CadeMeuMedico.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using PagedList;
using CadeMeuMedico.GeocodeService;

namespace CadeMeuMedico.Controllers
{
    public class ConsultaMedicosController : Controller
    {

        private CadeMeuMedicoDBEntities db = new CadeMeuMedicoDBEntities();

        public ActionResult Index(string sortOrder, int? idEspecialidade, int? idCidade, int? page)
        {
            //Lista de Especialidades para Filtro
            var especialidades = db.Especialidades.OrderBy(e => e.Nome).ToList();
            var especialidadesSelectList = new List<SelectListItem>();

            foreach (var especialidade in especialidades)
            {
                especialidadesSelectList.Add(new SelectListItem()
                {
                    Text = especialidade.Nome,
                    Value = especialidade.IDEspecialidade.ToString()
                });
            }

            ViewBag.EspecialidadesSelectList = especialidadesSelectList;

            //Lista de Cidades para Filtro
            var cidades = db.Cidades.OrderBy(c => c.Nome).ToList();
            var cidadesSelectList = new List<SelectListItem>();

            foreach (var cidade in cidades)
            {
                cidadesSelectList.Add(new SelectListItem()
                {
                    Text = cidade.Nome,
                    Value = cidade.IDCidade.ToString()
                });
            }

            ViewBag.CidadesSelectList = cidadesSelectList;

            ViewBag.CurrentSort = sortOrder;
            ViewBag.NomeSortParm = String.IsNullOrEmpty(sortOrder) ? "nome_desc" : "";
            ViewBag.CrmSortParm = sortOrder == "crm" ? "crm_desc" : "crm";

            ViewBag.IdEspecialidade = idEspecialidade;
            ViewBag.IdCidade = idCidade;

            var medicos = from s in db.Medicos
                          select s;

            if (idEspecialidade.HasValue)
            {
                medicos = medicos.Where(m => m.IDEspecialidade == idEspecialidade.Value);
            }

            if (idCidade.HasValue)
            {
                medicos = medicos.Where(m => m.IDCidade == idCidade.Value);
            }

            switch (sortOrder)
            {
                case "nome_desc":
                    medicos = medicos.OrderByDescending(s => s.Nome);
                    break;
                case "crm":
                    medicos = medicos.OrderBy(s => s.CRM);
                    break;
                case "crm_desc":
                    medicos = medicos.OrderByDescending(s => s.CRM);
                    break;
                default:
                    medicos = medicos.OrderBy(s => s.Nome);
                    break;
            }
        
            int pageSize = 3;
            int pageNumber = (page ?? 1);
            return View(medicos.ToPagedList(pageNumber, pageSize));
        }

        public ActionResult GetLocations(int idMedico)
        {
            Medicos medico = db.Medicos.SingleOrDefault(m => m.IDMedico == idMedico);
            string endereco = null;

            if (medico != null)
            {
                Cidades cidade = db.Cidades.SingleOrDefault(c => c.IDCidade == medico.IDCidade);

                if (cidade != null)
                {
                    endereco = string.Format("{0}, {1}", medico.Endereco, cidade.Nome);
                }
            }

            string lat = string.Empty;
            string lng = string.Empty;

            GeocodeRequest geocodeRequest = new GeocodeRequest();

            // Set the credentials using a valid Bing Maps key
            geocodeRequest.Credentials = new GeocodeService.Credentials();
            geocodeRequest.Credentials.ApplicationId = "AvW00CilYAUa8-GrAXIZl9dT6FL6-I73IOUxFk6xrsqUZ0T4vZZPdL787K02to-I";

            // Set the full address query
            geocodeRequest.Query = endereco;

            // Set the options to only return high confidence results 
            ConfidenceFilter[] filters = new ConfidenceFilter[1];
            filters[0] = new ConfidenceFilter();
            filters[0].MinimumConfidence = GeocodeService.Confidence.High;

            // Add the filters to the options
            GeocodeOptions geocodeOptions = new GeocodeOptions();
            geocodeOptions.Filters = filters;
            geocodeRequest.Options = geocodeOptions;
            ExecutionOptions execOptions = new ExecutionOptions();

            // Make the geocode request
            GeocodeServiceClient geocodeService = new GeocodeServiceClient("BasicHttpBinding_IGeocodeService");

            if (geocodeService.Geocode(geocodeRequest).Results.Any(o => o.Locations != null && o.Locations.Any()))
            {
                lat = geocodeService.Geocode(geocodeRequest).Results.FirstOrDefault().Locations.FirstOrDefault().Latitude.ToString().Replace(',', '.');
                lng = geocodeService.Geocode(geocodeRequest).Results.FirstOrDefault().Locations.FirstOrDefault().Longitude.ToString().Replace(',', '.');
            }

            geocodeService.GeocodeAsync(geocodeRequest);

            var locations = new List<Bing.Locations>() {
                new Bing.Locations(lat, lng, endereco)
            };
            return Json(locations, JsonRequestBehavior.AllowGet);
        }

    }
}
